import {ids} from "webpack";

let a: number = 10;
// ts : 数据类型 Void Any enum tuple Never


// 数据类型 声明
// let obj = {a:'123', age: 123};


// type : 变量别名(联合类型)  interface :接口

interface Person {
  name: string;
  age: number;
  // [x: string]: any;
  sex?: boolean // 可选项
}

let obj: Person = {
  name: '小三',
  age: 20,
  sex: true
};

// 一个变量既可以是A类型又可以是B类型 联合类型

interface A {
  x: number
}

interface B {
  y: number
}

// 变量别名  联合类型
type AB = A | B;


function getAB(ab: AB): string {
  let x: number = 0;
  let y: number = 0;
  // 关键字 in
  if ('x' in ab) {
    x = ab.x;
  }
  if ('y' in ab) {
    y = ab.y;
  }

  return `x:${x},y:${y}`
}

console.log(getAB({x: 10, y: 12}));

// 用在哪比较多 ? vue : ts部分不多 (vue 3.0) react :比较多


// 交叉类型 &
interface X {
  c: string; // Never
  d: string;
}

interface Y {
  c: string; // Never
  e: string;
}


type XY = X & Y;

// let a: XY = {c:'123',d:'123', e: '123'};

// 同名基础类型属性的合并

interface D {
  d: string;
}

interface E {
  e: string[];
}

interface F {
  f: string;
}

// 交叉类型
interface X {
  x: D;
}

interface Y {
  x: E;
}

interface Z {
  x: F;
}

type XYZ = X & Y & Z;

// @ts-ignore
let xyz: XYZ = {
  x: {
    d: '小明',
    e: ['a', 'b', 'c'],
    f: '哈哈'
  }
};
console.log(xyz);

// 车
// 枚举
// 摩托车 type motoPrice 汽车 :自动挡 手动挡 火车  transPrice

// v-type
// motoPrice  carPrice  transPrice

// 写一个函数 传递的是一个车  p = {vType : '', }
// 判断 传递的是什么车  价格

//2. 枚举
enum CarTypes {
  Auto = 300,
  Mual = 200
}

interface CarParent{
  a: string;
}

//1. 声明3个接口
interface Motor extends CarParent{
  vType: string;
  motorPrice: number;

}

interface Car {
  vType: string;
  carPrice: CarTypes;
}

interface Track {
  vType: string;
  transPrice: number;
}

type CarType = Motor | Car | Track;

function getInfo(p: CarType): string {
  let priceBase: number = Math.PI;
  let str: string = '';
  if ('motorPrice' in p) {
    str += `${p.vType} 价钱 ${p.motorPrice * priceBase} 元`;
  } else if ('carPrice' in p) {
    switch (p.carPrice) {
      case CarTypes.Auto:
        str += `${p.vType} 自动挡 价钱: ${p.carPrice * priceBase} 元`;
        break;
      case CarTypes.Mual:
        str += `${p.vType} 手动挡 价钱:${p.carPrice * priceBase} 元`;
        break;
    }

  } else if ('transPrice' in p) {
    str += `${p.vType} 价钱 ${p.transPrice * priceBase} 元`;
  }
  return str;
}

let pp = {
  vType: '劳斯莱斯',
  carPrice: CarTypes.Auto
};
console.log(getInfo(pp));










